/**
@file ./src/sql/respository.js
@fileoverview 该模块提供了数据库操作的封装，通过动态加载不同数据库驱动模块来执行查询、分页查询和执行SQL语句等操作。
@author [ZouAnZu]
@version 1.0 
*/
// 用于存储不同数据库驱动模块的对象
const respositorys={}
/**
设置数据库驱动模块
@description 此函数用于动态加载指定名称的数据库驱动模块。如果respositorys对象中不存在该驱动模块，则通过require语句加载并存储在respositorys中。
@param {string} driveName - 数据库驱动名称 
*/
const setDbDrive=(driveName)=>{
    // console.log(driveName)
    if (!respositorys.hasOwnProperty(driveName))
        respositorys[driveName]=require(`./${driveName}`)
}
/**

执行SQL语句
@description 此函数用于执行SQL语句。首先调用setDbDrive加载数据库驱动模块，然后调用相应驱动模块的exec方法执行SQL语句，并返回执行结果。
@param {string} sql - 要执行的SQL语句
@param {array} args - SQL语句中的参数数组
@param {string} dbDrive - 数据库驱动名称
@returns {Promise} - 一个Promise对象，解析后返回数据库操作的结果 
*/ 
const exec=async (sql,args,dbDrive)=>{
    console.time('QueryTime');
    setDbDrive(dbDrive)
    const result=await respositorys[dbDrive].exec(sql,args)
    console.timeEnd('QueryTime');
    return result;

}
const getList=async (sql,args,dbDrive)=>{
    setDbDrive(dbDrive)
    console.time('QueryTime');
    const result=await respositorys[dbDrive].getList(sql,args)
    console.timeEnd('QueryTime');
    return result;
}
const getPageList=async (sqls,dbDrive)=>{
    setDbDrive(dbDrive)
    console.time('QueryTime');
    const result=await respositorys[dbDrive].getPageList(sqls)
    console.timeEnd('QueryTime');
    return result;
}
module.exports = {
    getList,
    getPageList,
    exec
  };